package com.swu.java.hc077.ui;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.swu.java.hc077.factory.FactoryListener;

/**
 * 关于calc界面设计的代码
 * 
 * @author Mc 界面设计代码放于构造方法中，这似乎是一种习惯
 */
public class MyProgramUiDevise extends JFrame {

	private static final long serialVersionUID = 1L;
	private final String[] buttontext = { "Ⅰ⑩→②", "Ⅱ⑩→⑯", "Ⅲ⑯→⑩", "Ⅳ⑯→②", "Ⅴ②→⑩",
			"Ⅵ②→⑯", "A", "B", "C", "D", "E", "F" };
	private String THE_CALC_BUTTON_LOGO = "123←456+789-.0*/^%M=";
	private JTextField jTextField;
	private JLabel jLabelResult;
	private JButton jButton;
	private JButton jButtonForBinaryConversion;//BinaryConversion 进制转换
	private JPanel jPanel;
	public static boolean prompt;//这个提示标识：监听里根据他判断进制转换按钮事件，主方法里根据他来设置窗口的实际大小
	//这里的static真的十分重要

	/**
	 * 构造方法，一般界面设计，代码放在构造方法中，这似乎是一个习惯
	 * 
	 * 备注： 思路是，首先循环添加所有button 在创建一个工具类，工具类里加入监听， 并且在创建监听类时
	 * 加入有参构造，意在创建按钮时，把他通过监听构造传递过来 ，达到用循环创建按钮，单一监听处理多个类似事件的目的 .
	 * 之前那之所以不行的原因在于，当你循环创建button时，所有button标示符都一样
	 * 他们在创建并添加到panel，当本次循环结束，就被回收，所以没办法根据标示符去 区分每个button 并且得到他们的text
	 * 因此出现点击每个按钮，文本框都显示最后 一个字符，解决思路是：在创建之后立即把该button 传递到监听类去。当然你也可
	 * 以创建button数组来区分每个按钮，但是似乎提供类似的数组构建按钮的方法十分 有限
	 */
	public MyProgramUiDevise() {
		super();
		
		jTextField = new JTextField();// 存放算式
		jLabelResult = new JLabel();// 存放结果
		jPanel = new JPanel();
		jPanel.setLayout(new GridLayout(2, 1));// 不能不加布局发方式
		jPanel.add(jTextField);
		jPanel.add(jLabelResult);
		add(jPanel, BorderLayout.NORTH);

		jPanel = new JPanel();
		jPanel.setLayout(new GridLayout(5, 4,8,8));
		for (int i = 0; i < 20; i++) {

			char logo = THE_CALC_BUTTON_LOGO.charAt(i);
			jButton = new JButton(" " + logo);// 这里由于加了一个空格，在后面的监听里用switch
			// 或者for一直不成功！原因是jbutton的text是空格+数字/运算符
			jPanel.add(jButton);
			char mark = jButton.getText().charAt(1);
			jButton.addActionListener(new FactoryListener(jTextField, jButton,
					jLabelResult, mark));
		}
		add(jPanel, BorderLayout.CENTER);

		// 点击按钮，进制转换界面可见 传入
		jPanel=new JPanel();
		jButton = new JButton("|进制转换开启按钮|");// 用 char at 获取标志字符，这个字符必须是计算器上没有出现的
		char markMainButton = jButton.getText().charAt(0);
		System.out.println(markMainButton);
		
		JPanel	jPanelForBinaryConversion = new JPanel();
		jPanelForBinaryConversion.setLayout(new GridLayout(5, 3,8,8));//这里为什么是5,3，应该是4.3，想不通
		for (int i = 0; i < 12; i++) {
			jButtonForBinaryConversion = new JButton(buttontext[i]);//这里再次添加监听实现功能
			char mark = jButtonForBinaryConversion.getText().charAt(0);
			
			jButtonForBinaryConversion.addActionListener(new FactoryListener(jTextField, jButton,
					jLabelResult, mark));
			jPanelForBinaryConversion.add(jButtonForBinaryConversion);
		}
		jPanelForBinaryConversion.setVisible(prompt);
		
		jPanel.add(jButton, BorderLayout.NORTH);
		jPanel.add(jPanelForBinaryConversion,BorderLayout.CENTER);
		add(jPanel,BorderLayout.SOUTH);
		jButton.addActionListener(new FactoryListener(jTextField, jButton, jLabelResult, markMainButton, jPanelForBinaryConversion ));
		jButton.addActionListener(new MyProgramMain());//在main方法所在类中添加一个监听来控制窗口大小
		
	}

	public JLabel getjLabelResult() {
		return jLabelResult;
	}

	public void setjLabelResult(JLabel jLabelResult) {
		this.jLabelResult = jLabelResult;
	}
	public JTextField getjTextField() {
		return jTextField;
	}

	public void setjTextField(JTextField jTextField) {
		this.jTextField = jTextField;
	}

	public JButton getjButton() {
		return jButton;
	}

	public void setjButton(JButton jButton) {
		this.jButton = jButton;
	}

	public JPanel getjPanel() {
		return jPanel;
	}

	public void setjPanel(JPanel jPanel) {
		this.jPanel = jPanel;
	}
}
